<?php

namespace App\Controllers;

use Framework\Database;
use Framework\Validation;
use Framework\Session;

class UserController
{
    protected $db;

    public function __construct()
    {
        $config = require basePath('config/db.php');
        $this->db = new Database($config);
    }

    public function login()
    {
        loadView('users/login');
    }

    public function create()
    {
        loadView('users/create');
    }

    public function store()
    {
        $name = $_POST['name'];
        $email = $_POST['email'];
        $city = $_POST['city'];
        $province = $_POST['province'];
        $password = $_POST['password'];
        $passwordConfirmation = $_POST['password_confirmation'];

        $errors = [];

        if (!Validation::email($email)) {
            $errors['email'] = '请输入一个合法的电子邮箱地址！';
        }

        if (!Validation::string($name, 2, 50)) {
            $errors['name'] = '姓名长度为2到50！';
        }

        if (!Validation::string($password, 6, 50)) {
            $errors['password'] = '密码长度为至少6位！';
        }

        if (!Validation::match($password, $passwordConfirmation)) {
            $errors['password_confirmation'] = '两次的输入密码不一致！';
        }

        if (!empty($errors)) {
            loadView('users/create', [
                'errors' => $errors,
                'user'  => [
                    'name' => $name,
                    'email' => $email,
                    'city' => $city,
                    'province' => $province,
                ]
            ]);

            exit;
        } else {
            $params = [
                'email' => $email
            ];

            $user = $this->db->query("SELECT * FROM users WHERE email = :email", $params)->fetch();

            if ($user) {
                $errors['email'] = "该邮箱已注册！";

                loadView('users/create', [
                    'errors' => $errors
                ]);

                exit;
            }
            $params = [
                'name' => $name,
                'email' => $email,
                'city' => $city,
                'province' => $province,
                'password' => password_hash($password, PASSWORD_DEFAULT)
            ];

            $this->db->query("INSERT INTO users (name, email, city, province, password) VALUES (:name, :email, :city, :province, :password)", $params);

            $userId = $this->db->conn->lastInsertId();

            Session::set('user', [
                'id'  => $userId,
                'name' => $name,
                'email' => $email,
                'city' => $city,
                'province' => $province
            ]);

            redirect('/');
        }
    }

    public function logout()
    {
        Session::clearAll();

        $params = session_get_cookie_params();

        setcookie('PHPSESSID', '', time() - 86400, $params['path'], $params['domain']);

        redirect('/');
    }

    public function authenticate()
    {
        $email = $_POST['email'];
        $password = $_POST['password'];

        $errors = [];

        if (!Validation::email($email)) {
            $errors['email'] = '请输入合法的邮箱地址！';
        }

        if (!Validation::string($password, 6, 50)) {
            $errors['password'] = '密码为至少6位!';
        }

        if (!empty($errors)) {
            loadView('users/login', [
                'errors' => $errors
            ]);
            exit;
        }

        $params = [
            'email' => $email
        ];

        $user = $this->db->query('SELECT * FROM users WHERE email = :email', $params)->fetch();

        if (!$user) {
            $errors['email'] = '用户不存在或密码错误！';
            loadView('users/login', [
                'errors' => $errors
            ]);
            exit;
        }

        if (!password_verify($password, $user->password)) {
            $errors['email'] = '用户不存在或密码错误！';
            loadView('users/login', [
                'errors' => $errors
            ]);
            exit;
        }

        Session::set('user', [
            'id' => $user->id,
            'name' => $user->name,
            'email' => $user->email,
            'city' => $user->city,
            'province' => $user->province
        ]);

        redirect('/');
    }
}
